Skip to content

engine_getBlobsV4#774

Merged
mkalinin merged 13 commits intoethereum:mainfrom
kamilsa:update/engine-getBlobsV4-spec
May 1, 2026
Merged

engine_getBlobsV4#774
mkalinin merged 13 commits intoethereum:mainfrom
kamilsa:update/engine-getBlobsV4-spec

Conversation

@kamilsa
Copy link
Copy Markdown
Contributor

@kamilsa kamilsa commented Mar 21, 2026

Companion PR to ethereum/EIPs#11444 . The current PR is expected to be merged first.

To support EIP-8070 (sparse blobpools) :

  1. engine_getBlobsV4: provides the mechanism for the CL to request partial blobs data from the the EL's blobpool
  2. engine_forkchoiceupdatedv4: updated with the column custody field to update EL about CL's custody column set

kamilsa and others added 5 commits March 21, 2026 19:04
- Expand V4 spec from 1 line to 7 detailed specification points mirroring V3 style
- Add support for multiple blob versioned hashes in example (3 blobs)
- Clarify missing blob handling (return null at corresponding positions)
- Add support for partial blobs with null cells and null proofs
- Update response schema to allow null entries (oneOf pattern)
- Include example with: present blob, partial blob with null cell, missing blob

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kamilsa kamilsa changed the title Update engine_getBlobsV4 specification and examples engine_getBlobsV4 and engine_blobCustodyUpdatedV1 Apr 10, 2026
@kamilsa kamilsa marked this pull request as ready for review April 10, 2026 10:22
Copilot AI review requested due to automatic review settings April 10, 2026 10:22
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds new Engine API capabilities needed for EIP-8070 “sparse blobpools”, enabling the CL to (1) communicate its blob column custody set to the EL and (2) request partial blob cell data (with proofs) from the EL blobpool.

Changes:

  • Introduces engine_blobCustodyUpdatedV1 for CL→EL custody-set updates via a 16-byte bitarray.
  • Introduces engine_getBlobsV4 for fetching requested blob cells + KZG proofs (including partial/missing data semantics).
  • Adds shared schema types (bytes16, BlobCellsAndProofsV1) and updates fork documentation/spellcheck wordlist accordingly.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
wordlist.txt Adds the new versioned schema/method-related token for spellchecking.
src/schemas/base-types.yaml Adds a reusable bytes16 primitive used by the new methods’ bitarray params.
src/engine/openrpc/schemas/blob.yaml Defines BlobCellsAndProofsV1 response object for partial cell/proof returns.
src/engine/openrpc/methods/blob.yaml Adds OpenRPC method entries for engine_blobCustodyUpdatedV1 and engine_getBlobsV4 (with examples).
src/engine/amsterdam.md Documents the new structure and method specs in the Amsterdam fork markdown (including ToC updates).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/engine/openrpc/methods/blob.yaml Outdated
Comment thread src/engine/amsterdam.md Outdated
kamilsa and others added 2 commits April 14, 2026 14:40
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@kamilsa kamilsa changed the title engine_getBlobsV4 and engine_blobCustodyUpdatedV1 engine_getBlobsV4 Apr 14, 2026
@dapplion
Copy link
Copy Markdown
Member

we will ship this !!

Comment thread src/engine/amsterdam.md
* params:
1. `forkchoiceState`: [`ForkchoiceStateV1`](./paris.md#ForkchoiceStateV1).
2. `payloadAttributes`: `Object|null` - Instance of [`PayloadAttributesV4`](#payloadattributesv4) or `null`.
3. `custodyColumns`: `DATA|null`, 16 Bytes - Interpreted as a bitarray of length `CELLS_PER_EXT_BLOB` indicating which column indices form the CL's custody set, or `null` if the CL does not provide custody services.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are we certain that no network in the future will use CELLS_PER_EXT_BLOB > 128?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, for the midterm, and we can adjust this length later, right ?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could extend this field to Bytes32 with the high part zeroed out, doesn’t seem to be a big overhead. If we stick with Bytes16 for now and this number will be increased in the future we will have to introduce a new version of fcU. I don’t have a strong opinion on that, and would lean on whatever you think is reasonable

Comment thread src/engine/amsterdam.md Outdated
Comment thread src/engine/amsterdam.md Outdated
Comment thread src/engine/amsterdam.md Outdated
Comment thread src/engine/openrpc/methods/forkchoice.yaml
Comment thread src/engine/openrpc/schemas/blob.yaml Outdated
Comment thread src/engine/openrpc/schemas/blob.yaml Outdated
Copy link
Copy Markdown
Member

@raulk raulk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: optionality of the custody column filter. We have been designing solutions for in-transit reconstruction at the CL. There is a scenario in which we'd want the EL to serve all cells it has buffered, regardless of the CL's custody set. That would include "excess" cells when acting as a sampler, and all cells when acting as a provider.

@healthykim
Copy link
Copy Markdown

Re: optionality of the custody column filter. We have been designing solutions for in-transit reconstruction at the CL. There is a scenario in which we'd want the EL to serve all cells it has buffered, regardless of the CL's custody set. That would include "excess" cells when acting as a sampler, and all cells when acting as a provider.

What filter are you referring to ? This is possible with setting the bitmap array in getBlobsV4 request to all 1, right ?

Comment thread src/engine/amsterdam.md
* method: `engine_getBlobsV4`
* params:
1. `versioned_blob_hashes`: `Array of DATA`, 32 Bytes - an array of blob versioned hashes.
2. `indices_bitarray`: `DATA`, 16 Bytes - a bitarray denoting the indices of the cells to retrieve.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is already doable with the proposed API.

CL can set indices_bitarray to all ones. That way CL requests EL to provide all cells it has for the requested versioned blob hashes. For the missing cells (e.g. for cells that EL was acting as a sampler) request will contain nulls in the blob_cells field

kamilsa and others added 6 commits April 29, 2026 18:29
@kamilsa
Copy link
Copy Markdown
Contributor Author

kamilsa commented Apr 30, 2026

@mkalinin I believe I addressed all your comments

Copy link
Copy Markdown
Contributor

@mkalinin mkalinin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 👍

@mkalinin mkalinin merged commit 189f407 into ethereum:main May 1, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.